home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sprite 1984 - 1993
/
Sprite 1984 - 1993.iso
/
src
/
cmds
/
raidioc
/
raidioc.c
< prev
Wrap
C/C++ Source or Header
|
1992-02-29
|
6KB
|
218 lines
/*
* raidioc.c --
*
* Initiates RAID IO-control operations.
*
* Copyright 1989 Regents of the University of California
* Permission to use, copy, modify, and distribute this
* software and its documentation for any purpose and without
* fee is hereby granted, provided that the above copyright
* notice appear in all copies. The University of California
* makes no representations about the suitability of this
* software for any purpose. It is provided "as is" without
* express or implied warranty.
*/
#ifndef lint
static char rcsid[] = "$Header: /sprite/lib/forms/RCS/proto.c,v 1.2 89/01/07 04:12:18 rab Exp $ SPRITE (Berkeley)";
#endif /* not lint */
#include <sys/file.h>
#include <stdio.h>
#include "dev/raid.h"
#define OUT_BUF_SIZE 256
#define IN_BUF_SIZE 4096
char inBuf[IN_BUF_SIZE];
RaidIOCParam *IOCParam = (RaidIOCParam *) inBuf;
char outBuf[OUT_BUF_SIZE]; /* buffer for messages returned by IOC */
char *cmdName;
/*
*----------------------------------------------------------------------
*
* PrintUsage --
*
* Prints correct usage of command.
*
* Results:
* None.
*
* Side effects:
* Prints correct usage.
*
*----------------------------------------------------------------------
*/
void
PrintUsage()
{
printf("Usage:\n");
printf("\t%s <dev> print\n", cmdName);
printf("\t%s <dev> reconfig configfile\n", cmdName);
printf("\t%s <dev> lock\n", cmdName);
printf("\t%s <dev> unlock\n", cmdName);
printf("\t%s <dev> enable\n", cmdName);
printf("\t%s <dev> disable\n", cmdName);
printf("\t%s <dev> savestate\n", cmdName);
printf("\t%s <dev> enablelog\n", cmdName);
printf("\t%s <dev> disablelog\n", cmdName);
printf("\t%s <dev> hardinit <startStripe> <numStripe> [<uSec>]\n",cmdName);
printf("\t%s <dev> paritycheck <startStripe> <numStripe> [<uSec>]\n",cmdName);
printf("\t%s <dev> fail <row> <col>\n", cmdName);
printf("\t%s <dev> replace <row> <col> <type> <unit>\n", cmdName);
printf("\t%s <dev> reconstruct <row> <col> [<numSector> <uSec>]\n",cmdName);
printf("\t%s <dev> restorestate <type> <unit> <offset>\n",cmdName);
}
/*
*----------------------------------------------------------------------
*
* main --
*
* Initiates IOC's.
*
* Results:
* None.
*
* Side effects:
* Depends on IOC.
*
*----------------------------------------------------------------------
*/
main(argc, argv)
int argc;
char **argv;
{
int fd;
int configFd;
int status;
int IOCcmd;
int n;
cmdName = *argv;
argc--; argv++;
if (argc < 1) {
PrintUsage();
return(1);
}
fd = open(*argv, O_RDONLY, 0);
if (fd < 0) {
fprintf(stderr, "Error: could not open device '%s'\n", *argv);
return(2);
}
argc--; argv++;
if (argc < 1) {
PrintUsage();
return(-1);
}
if (strcmp("print", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_PRINT; argc--; argv++;
} else if (strcmp("reconfig", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_RECONFIG; argc--; argv++;
if (argc < 1) {
PrintUsage();
return(-1);
}
configFd = open(*argv, O_RDONLY, 0666);
if (configFd < 0) {
fprintf(stderr, "Error: could not open device '%s'\n", *argv);
return(2);
}
argc--; argv++;
n = read(configFd, IOCParam->buf, IN_BUF_SIZE-1-sizeof(RaidIOCParam));
IOCParam->buf[n] = 0;
close(configFd);
puts(IOCParam->buf);
status = Fs_IOControl(fd, IOCcmd, sizeof(RaidIOCParam)+n+1, IOCParam,
OUT_BUF_SIZE, outBuf);
printf("status:%d\n", status);
return status;
} else if (strcmp("hardinit", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_HARDINIT; argc--; argv++;
if (argc < 2) {
PrintUsage();
return(-1);
}
IOCParam->startStripe = atoi(*argv); argc--; argv++;
IOCParam->numStripe = atoi(*argv); argc--; argv++;
} else if (strcmp("paritycheck", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_PARITYCHECK; argc--; argv++;
if (argc < 2) {
PrintUsage();
return(-1);
}
IOCParam->startStripe = atoi(*argv); argc--; argv++;
IOCParam->numStripe = atoi(*argv); argc--; argv++;
} else if (strcmp("fail", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_FAIL; argc--; argv++;
if (argc < 2) {
PrintUsage();
return(-1);
}
IOCParam->row = atoi(*argv); argc--; argv++;
IOCParam->col = atoi(*argv); argc--; argv++;
} else if (strcmp("replace", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_REPLACE; argc--; argv++;
if (argc < 4) {
PrintUsage();
return(-1);
}
IOCParam->row = atoi(*argv); argc--; argv++;
IOCParam->col = atoi(*argv); argc--; argv++;
IOCParam->type = atoi(*argv); argc--; argv++;
IOCParam->unit = atoi(*argv); argc--; argv++;
} else if (strcmp("reconstruct", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_RECONSTRUCT; argc--; argv++;
if (argc < 4) {
PrintUsage();
return(-1);
}
IOCParam->row = atoi(*argv); argc--; argv++;
IOCParam->col = atoi(*argv); argc--; argv++;
IOCParam->numStripe = atoi(*argv); argc--; argv++;
IOCParam->uSec = atoi(*argv); argc--; argv++;
} else if (strcmp("lock", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_LOCK; argc--; argv++;
} else if (strcmp("unlock", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_UNLOCK; argc--; argv++;
} else if (strcmp("enable", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_ENABLE; argc--; argv++;
} else if (strcmp("disable", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_DISABLE; argc--; argv++;
} else if (strcmp("savestate", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_SAVE_STATE; argc--; argv++;
} else if (strcmp("enablelog", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_ENABLE_LOG; argc--; argv++;
} else if (strcmp("disablelog", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_DISABLE_LOG; argc--; argv++;
} else if (strcmp("restorestate", *argv) == 0) {
IOCcmd = IOC_DEV_RAID_RESTORE_STATE; argc--; argv++;
if (argc < 3) {
PrintUsage();
return(-1);
}
IOCParam->type = atoi(*argv); argc--; argv++;
IOCParam->unit = atoi(*argv); argc--; argv++;
IOCParam->startStripe = atoi(*argv); argc--; argv++;
} else {
PrintUsage();
return(-1);
}
printf("ROW %d:COL %d:TYPE %d:UNIT %d:START_STRIPE %d:NUM_STRIPE %d:USEC %d\n",
IOCParam->row, IOCParam->col, IOCParam->type, IOCParam->unit,
IOCParam->startStripe, IOCParam->numStripe, IOCParam->uSec);
status = Fs_IOControl(fd, IOCcmd, sizeof(RaidIOCParam), IOCParam, OUT_BUF_SIZE, outBuf);
printf("status:%d\n", status);
outBuf[OUT_BUF_SIZE] = '\0';
puts(outBuf);
exit(status);
}